/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.compassion.action;

import com.opensymphony.xwork2.ActionContext;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.json.JSONObject;
import sv.com.compassion.dao.GenericoDAO;
import sv.com.compassion.entidades.Asociacion;
import sv.com.compassion.entidades.Cdi;
import sv.com.compassion.entidades.Empleado;
import sv.com.compassion.entidades.Municipio;
import sv.com.compassion.util.ComunAction;
import sv.com.compassion.util.Constantes;
import sv.com.compassion.util.Fecha;
import sv.com.compassion.util.JqGrid;
import sv.com.compassion.util.RowsGrid;

/** Clase mantenimiento de usuarios, para controlar la selección de CDI´s; los CDI
* seleccionados se llevan en una variable en sesión llamada "cdi_Seleccionados", está se 
* "limpia" al momento de ingresar los CDI's seleccionados, en método AgregarEntidad.
*/
public class UsuarioAction2 extends ComunAction {
    private GenericoDAO genericoDAO;
    private Cdi cdi;
    private String DuiEmple;
    private String cdi_Seleccionado;
    private String actualizando;
 /**
 *Constructor.  
 *@param GenericoDAO interface donde se encuentran los métodos para acceder a 
 * a las clases entidades necesarias. 
 */ 
    
 
public UsuarioAction2(GenericoDAO genericoDAO){
        this.genericoDAO = genericoDAO;
        cdi = new    Cdi();
        
        cdi.setIdMunicipio(new Municipio());
}   
/**
 * Busca el método que se ejecutara
 */ 
    @Override
    public String execute(){
        buscarMetodo(cdi);        
        return null;
    }
 /**
 * Inserta las asociaciones de usuarios y CDI´s, toma el servicio de la clase entidad Asociacion para hacerlo. 
 */        
    @Override    
    public void agregarEntidad(Object o) {
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        String duiEmple = getRequest().getParameter("DuiEmple");
        String cdi_Seleccionando = "";
        String actualizando = getRequest().getParameter("actualizando");
        if(session.get("cdi_Seleccionados")!= null){
            cdi_Seleccionando = session.get("cdi_Seleccionados").toString();
        }
        if(actualizando != null && actualizando.equals("true")){
            Asociacion a;
            List<Asociacion> listaAsociacion = null;
            String queryIdEmp = "SELECT a FROM Asociacion a ";
            if(duiEmple != null && !duiEmple.equals("")){
                queryIdEmp +=  " WHERE a.idEmpleado =  (select idEmpleado from Empleado where duiEmpleado =  '" + duiEmple + "')";
            }
            listaAsociacion = genericoDAO.find(queryIdEmp, null, null);
            for(int i = 0;i < listaAsociacion.size(); i++){
                a = listaAsociacion.get(i);
                genericoDAO.delete(a);
            }

        }
        if(!cdi_Seleccionando.equals("")){
        String arraySeleccionados[] = cdi_Seleccionando.split(";");
        try{
            List<Empleado> listaEmpleado = null;
            String sql      =   "select e from Empleado e where duiEmpleado =  '" + duiEmple + "'";
            listaEmpleado   =   genericoDAO.find(sql,null,null);  
            int idEmpleado  =   listaEmpleado.get(0).getIdEmpleado();
            for(int i = 0; i < arraySeleccionados.length;i++){
                Asociacion a = new Asociacion();
                Empleado  e = new Empleado();
                Cdi  c = new Cdi();
                a.setFecIniAsociacion(new Date());

                e.setIdEmpleado(idEmpleado);
                a.setIdEmpleado(e);

                c.setIdCdi(Integer.parseInt(arraySeleccionados[i]));
                a.setIdCdi(c);

                a.setAuAddUsr(Integer.parseInt(idUsuario));
                a.setAuAddDat(new Date());

                genericoDAO.save(a);
            }
            session.put("cdi_Seleccionados","");
            }catch(Exception e){
                Logger.getLogger(UsuarioAction2.class.getName()).log(Level.SEVERE, null, e);
                enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
                session.put("cdi_Seleccionados","");
            }
      }          
    }
        @Override
    public void borrarEntidad(Object o) {
    }
        
        
      /**
      * En este método "editarEntidad" se lleva el control de los CDI´s seleccionados ó  de-seleccionados en el mantenimiento 
      */  
    @Override
    public void editarEntidad(Object o) {
        Map session = ActionContext.getContext().getSession();
        String cdi_request = getRequest().getParameter("cdi_Seleccionado");
        String cdi_Seleccionando = "";
        if(session.get("cdi_Seleccionados")!= null){
            cdi_Seleccionando = session.get("cdi_Seleccionados").toString();
        }
        boolean encontro = false;
        if(!cdi_Seleccionando.equals("")){
            String arraySeleccionados[] = cdi_Seleccionando.split(";");
            cdi_Seleccionando = "";
            
            for(int i = 0; i < arraySeleccionados.length;i++){
                if(arraySeleccionados[i].equals(cdi_request)){
                    encontro = true;
                }else{
                    cdi_Seleccionando += arraySeleccionados[i]+";";
                }
            }
        }    
        if(!encontro){
            cdi_Seleccionando += cdi_request+";";
        }    
        session.put("cdi_Seleccionados",cdi_Seleccionando);    
    }
 /**
 * Este método despliega los CDI's, para presentarlos en el popup del mantenimiento usuarios
 * para poder relacionar usuarios con CDI's
 * espera los filtros opcionales:
 *       idUsuario,
 *       idCargo,
 *       duiEmple
 */
    @Override
    public void alimentarGrid() {
        JqGrid jg = new JqGrid();
        int total = 0;
        List<Cdi> listaCdi = null;
        List<Asociacion> listaAsociacion = null;
        String query = "";
        Map session = ActionContext.getContext().getSession();
        String idUsuario = session.get("idUsuario").toString();
        String idCargo = session.get("idCargo").toString();
        //String idEmpleado = getRequest().getParameter("IdEmp");
        String duiEmple = getRequest().getParameter("DuiEmple");
        String actualizando = getRequest().getParameter("actualizando");
        String cdi_Seleccionando = ";";
        if(session.get("cdi_Seleccionados")!= null){
            cdi_Seleccionando += session.get("cdi_Seleccionados").toString();
        }
        /***********Verificando si se esta actualizando************/
        if(actualizando!=null && actualizando.equals("true")&&(session.get("cdi_Seleccionados")== null||session.get("cdi_Seleccionados").toString().equals(""))){
                String queryIdEmp = "SELECT a FROM Asociacion a ";
                if(duiEmple != null && !duiEmple.equals("")){
                    queryIdEmp +=  " WHERE a.idEmpleado =  (select idEmpleado from Empleado where duiEmpleado =  '" + duiEmple + "')";
                }
                listaAsociacion = genericoDAO.find(queryIdEmp,null,null);
                String cdiAsociados = "";
                for(Asociacion a: listaAsociacion){
                        cdiAsociados += a.getIdCdi().getIdCdi().toString()+";";
                }
                session.put("cdi_Seleccionados",cdiAsociados);
                cdi_Seleccionando += cdiAsociados;
        }
        
  

        try{
                if(idCargo.equals("6")||idCargo.equals("7")||idCargo.equals("8")){
                    query = "SELECT c FROM Cdi c WHERE c.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "') and";
                    if(getNomCdi()!=null && !getNomCdi().equals("")){
                        query   +=   "  c.nomCdi like '%"+getNomCdi()+"%' and";
                    }
                }else{
                    query = "SELECT c FROM Cdi c WHERE";
                    /*if(getNomCdi()!=null && !getNomCdi().equals("")){
                        query   +=   " c.nomCdi like '%"+getNomCdi()+"%' and";
                    }*/
                }
                query += " c.estCdi = 1";
                query   += " ORDER BY c.nomCdi " + getSord();  
                listaCdi = genericoDAO.find(query,getRows(),(getRows()*getPage())-getRows());
       
                if(idCargo.equals("6")||idCargo.equals("7")||idCargo.equals("8")){
                    query = "SELECT count(c) FROM Cdi c WHERE c.idCdi IN (SELECT x.idCdi FROM Asociacion x WHERE x.idEmpleado = '" + idUsuario + "') "
                            + "and c.estCdi = 1";
                }else{
                    query = "SELECT count(c) FROM Cdi c where "
                            + " c.estCdi = 1";
                }
                total = genericoDAO.countRow(query);
                //configuraciones basicas
                jg.setPage(getPage());
                jg.setRecords(total);
                jg.setTotal((int) Math.ceil((double) total / (double) getRows()));
                jg.setSord(getSord());
                jg.setSidx(getSidx());
                
               
                List<RowsGrid> rows = new ArrayList<RowsGrid>();
                
                for(Cdi c: listaCdi){
                    RowsGrid r = new RowsGrid(); 
                    r.setId(c.getIdCdi().toString());
                    List cell = new ArrayList();
                    
                    cell.add(c.getNomCdi());
                    if(!cdi_Seleccionando.equals(";")&&cdi_Seleccionando.contains(";"+c.getIdCdi()+";")){
                        cell.add("<input type=\"checkbox\" name\"option2\" onclick=\"seleccionado("+c.getIdCdi()+")\" value=\""+c.getIdCdi()+"\" id=\""+c.getIdCdi()+"\" checked> ");                        
                    }else{
                        cell.add("<input type=\"checkbox\" name\"option2\" onclick=\"seleccionado("+c.getIdCdi()+")\" value=\""+c.getIdCdi()+"\" id=\""+c.getIdCdi()+"\"> ");
                    }
                    
                    r.setCell(cell);
                    rows.add(r);
                }

                jg.setRows(rows);
                JSONObject jo = JSONObject.fromObject(jg);
                enviarJsonNavegador(getResponse(), jo);
        }catch(Exception e){
            Logger.getLogger(UsuarioAction2.class.getName()).log(Level.SEVERE, null, e);
            enviarMensajeStatic(Constantes.MENSAJE_ERROR+e.getCause().toString(), getResponse());
        }
    }

    public Integer getIdCdi() {
        return cdi.getIdCdi();
    }

    public void setIdCdi(Integer idCdi) {
        cdi.setIdCdi(idCdi);
    }

    public String getNomCdi() {
        return cdi.getNomCdi();
    }

    public void setNomCdi(String nomCdi) {
        cdi.setNomCdi(nomCdi);
    }

    public String getDirCdi() {
        return cdi.getDirCdi();
    }

    public void setDirCdi(String dirCdi) {
        cdi.setDirCdi(dirCdi);
    }

    public int getEstCdi() {
        return cdi.getEstCdi();
    }

    public void setEstCdi(int estCdi) {
        cdi.setEstCdi(estCdi);
    }

    public String getTelCdi() {
        return cdi.getTelCdi();
    }

    public void setTelCdi(String telCdi) {
        cdi.setTelCdi(telCdi);
    }

    public String getFecIniCdi() {
        return Fecha.date2String(cdi.getFecIniCdi());
    }

    public void setFecIniCdi(String fecIniCdi) {
       try {
            cdi.setFecIniCdi(Fecha.string2Date(fecIniCdi));
        } catch (ParseException ex) {
            Logger.getLogger(CdiAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String getFecCierreCdi() {
        return Fecha.date2String(cdi.getFecCierreCdi());
    }

    public void setFecCierreCdi(String fecCierreCdi) {
        try {
            cdi.setFecCierreCdi(Fecha.string2Date(fecCierreCdi));
        } catch (ParseException ex) {
            Logger.getLogger(CdiAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public int getAuAddUsr() {
        return cdi.getAuAddUsr();
    }

    public void setAuAddUsr(int auAddUsr) {
        cdi.setAuAddUsr(auAddUsr);
    }

    public String getAuAddDat() {
        return Fecha.date2String(cdi.getAuAddDat());
    }

    public void setAuAddDat(String auAddDat) {
        try {
            cdi.setAuAddDat(Fecha.string2Date(auAddDat));
        } catch (ParseException ex) {
            Logger.getLogger(CdiAction.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public Integer getAuModUsr() {
        return cdi.getAuModUsr();
    }

    public void setAuModUsr(Integer auModUsr) {
        cdi.setAuModUsr(auModUsr);
    }

    public Date getAuModDat() {
        return cdi.getAuModDat();
    }

    public void setAuModDat(Date auModDat) {
        cdi.setAuModDat(auModDat);
    }

    public Integer getIdMunicipio() {
        return cdi.getIdMunicipio().getIdMunicipio();
    }

    public void setIdMunicipio(Integer idMunicipio) {
        cdi.getIdMunicipio().setIdMunicipio(idMunicipio);
    }
    
    @Override
    public void reporteXls() {
    } 
}
